#21 列出数字列表的所有平方 (列表推导式)
# li=[x**2 for x in range(10)]
# print(li)

#22 获取一个数字的绝对值 (内置函数)
# x=100
# y=-10
# print(f"获取一个数字的绝对值,比如:{abs(x),abs(y)}")

#23 判断两个字符串是否是 anagram (字符串排序，计数)
# str1="abddc"
# str2="addcb"
# hash1=dict()
# hash2=dict()
# for ch1,ch2 in zip(str1,str2):
#     if(ch1 in hash1):
#         hash1[ch1]+=1
#     else:
#         hash1[ch1]=1
#     if(ch2 in hash2):
#         hash2[ch2]+=1
#     else:
#         hash2[ch2]=1
# if(hash1 == hash2):
#     print(f"{str1}和{str2}两个字符串是 anagram")
# else:
#     print(f"{str1}和{str2}两个字符串不是 anagram")

#24 将字符串转换为大写或小写 (字符串方法)
# str1="avsdasgfas"
# print(f"将字符串转换为小写,{str1.lower()}")
# print(f"将字符串转换为小写,{str1.upper()}")

#25 查找字符串中的所有子串 (字符串切片与循环)
#注意这是子字符串而不是子序列
# str1 = "abc"
# s=set()
# for i in range(len(str1)):
#     for y in range(i,len(str1)+1):
#         s.add(str1[i:y])
# print(f"查找{str1}中的所有子串:{s}")

#26 检查一个数字是否在列表中 (in运算符)
# li=[1,2,3,4,5,6,7,8,9,10,12,14,15,16]
# while(True):
#     try:
#         x=int(input("请输入需要判断的数字"))
#         break
#     except ValueError :
#         print("请输入正确的数字字符")
#     except:
#         print("发送未知错误,请重试")
# if x in li:
#     print(f"{x}在li当中")
# else:
#     print(f"{x}不在li当中")

#27 字符串查找特定字符的位置 (find/index方法)
# str1="avsdasgfas"
# #find负责查找子字符串,index负责类似find但是未发现会返回异常ValueError
# while(True):
#     x=input("请输入需要查找字符,区分大小写")
#     try:
#         print(f"{x}在这个字符串的{str1.index(x)}的位置")
#         break
#     except ValueError:
#         print("查找的字符不在{str1}当中")
#         print("请输入正确的字符,请不要输入非英文字母的字符")

# print(f"{x}在这个字符串的{str1.find(x)}的位置,-1表示不在这个字符串当中")


#28 反转列表 (列表方法或切片)
# li=[1,2,3,4,5,6,7,8,9]
# print(f"反转前的列表{li}")
# #方法一
# # li=li[::-1]
# #方法二,reverse单独作用在列表上
# li.reverse()
# print(f"反转后的列表{li}")

#29 求两个字符串的最长公共子串 (算法，考验字符串处理能力)
# def Longest_common_substring(str1,str2):
#     m=len(str1)
#     n=len(str2)
#     dp=[[0]*(n+1) for _ in range(m+1)]
#     max_length=0
#     Last_Pos=0
#     for i in range(1,m+1):  
#         for j in range(1,n+1):
#             if str1[i-1] == str2[j-1] :
#                 dp[i][j]=dp[i-1][j-1]+1
#                 if dp[i][j] > max_length:
#                     Last_Pos=i
#                     max_length=dp[i][j]
#             else:
#                 dp[i][j]=0
#     return str1[Last_Pos-max_length:Last_Pos]

# str1="avsdasgfas"
# str2="asgfasavsd"
# print(Longest_common_substring(str1,str2))


#30 获取列表中重复的元素 (集合或计数器)
# li=[1,2,3,4,5,6,7,8,9,0,10,2,4,8,6,2]
# # s1=set()
# # s2=set()
# # for x in li:
# #     if((x not in s1)):
# #         s1.add(x)
# #     else:
# #         s2.add(x)
# # print(f"li列表中重复的元素为{s2}")

# from collections import Counter
# count=Counter(li)
# s=set()

# for k,v in count.items():
#     if v > 1:
#         s.add(k)
# print(s)


#31 计算字典的键的数量 (len函数)
# dic={"a":0,"g":0,"z":0,"x":0,"d":0,"b":0,"v":0}
# print(len(dic))

#32 将一个字符串分割成多个子串 (split方法)
# str1="Hello World math Chinese Kindom"
# li=str1.split()
# print(li)

#33 判断字符串中是否包含某个子字符串 (in运算符)
# str1="Hello World math Chinese Kindom"
# str2 = "Hello"
# if str2 in str1:
#     print(f"{str2}在{str1}当中")


#34 获取列表中的所有唯一元素 (集合转换)
# li=[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,11]
# print(li)

# li=list(set(li))
# print(li)

#35 将列表中的元素以逗号分隔的方式打印 (join方法)
# li=[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,11]
# print(",".join(str(item) for item in li))

#36 判断两个字符串是否由相同的字符组成 (集合比较，排序)
# str1="Hello World math Chinese Kindom"
# str2="Hello World math Chinese Kindom zzzz "

# set1=set(str1)
# set2=set(str2)

# print(set1 == set2) 

#37 将一个字典的键转换为列表 (字典方法)
# dic={"a":1,"b":2,"b":2,"4":32,"5":67,"g":5,"c":2,"b2":23}
# li=[k for k in dic]
# print(li)


#38 去除字符串中的空格 (replace方法或正则表达式)
# str1="    dsadsa dasdasfds dasd asd we s     "
# print(str1.replace(" ",""))

#39 判断一个列表是否为空 (len或直接判断)
# li=[1,2,3,4,1,32]
# print(len(li) == 0)
# if li:
#     print(f"{li}不为空")

#40 使用 if-else 语句 (基础控制流)
# li=[1,2,3,4,1,32]
# print(len(li) == 0)
# if li:
#     print("li不为空")
# else:
#     print("li为空")